import { User } from './../../controllers/user/user.entity';
// import { AuditStatus } from './../../modules/record/audit.record.entity';
import { InstanceType } from 'typegoose';
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
import * as express from 'express';
import {
    globalError,
    NotAllowError,
} from '..//interceptors/httpResult.interceptor';

export const CheckLogin = createParamDecorator(
    async (data, ctx: ExecutionContext) => {
        const request = ctx.switchToHttp().getRequest();
        console.log('=====req.headers=====');
        console.log(request.headers);
        console.log('=====req.headers=====');
        let uid = request.headers.authorization;
        if (!uid) {
            globalError('请登录后再试！');
        }
        try {
          let [user] = await Promise.all([await User.findById(uid)]);
            // // 如果声明了仅限管理员，那么就验证是否是管理员；
            if (data === 'admin' && user.userType != 2) {
                NotAllowError();
            }
            // // 验证是wms的书商
            // if (data === 'bookseller' && !bookseller) {
            //     NotAllowError();
            // }
            // if (data === 'student' && !student) {
            //     NotAllowError();
            // }
            // // 否则只需要用户/管理员之一就可以
            // if (!data && !student) {
            //     globalError('请登陆后再试！');
            // }
            
            if (!data && !user) {
                globalError('请登陆后再试！');
            }
        } catch (error) {
            globalError('未知用户，请重新登录！');
        }
        return uid;
    },
);

// export const CheckLoginAndSelect = createParamDecorator(
//     async (
//         data: { role: 'admin' | 'bookseller' | 'student'; props: string },
//         req: express.Request,
//     ) => {
//         let uid = req.headers.authorization;
//         if (!uid) {
//             globalError('请登录后再试！');
//         }
//         try {
//             let [admin, bookseller, student] = await Promise.all([
//                 await Admin.findById(uid).select(data.props),
//                 await Bookseller.findById(uid).select(data.props),
//                 await Student.findById(uid).select(data.props),
//             ]);
//             // 如果声明了仅限管理员，那么就验证是否是管理员；
//             if (data.role === 'admin' && !admin) {
//                 globalError('无权操作！');
//             }
//             // 如果声明了仅限图书书商，那么就验证是否是书商；
//             if (data.role === 'bookseller' && !bookseller) {
//                 globalError('无权操作！');
//             }
//             // 如果声明了仅限小程序用户，那么就验证是否是用户；
//             if (data.role === 'student' && !student) {
//                 globalError('请登陆后再试！');
//             }
//             return admin || bookseller || student;
//         } catch (error) {
//             globalError('未知用户，请重新登录！');
//         }
//     },
// );

/**
 * 验证用户(uid)是否具备某一权限(permission)
 * 并总是返回主账号的ID
 *
 * permission的格式如下
 *   [w|r]:WMSFunctionPermissionType
 * 例如：
 *   r:warehouse/list       表示仓库列表的读取权限
 *   w:warehouse/inventory  表示库存查看的写入权限
 */
// export const CheckPermission = createParamDecorator(
//     async (permission: string, req: express.Request) => {
//         const uid = req.headers.authorization;
//         const { _id } = (await checkPermission(permission, uid)) as { _id };
//         return _id;
//     },
// );

// export async function checkPermission(
//     permission: string,
//     uid: string,
//     select: string = '',
// ) {
//     if (permission === 'noLogin') return true; // 有些API无需要求用户登录
//     if (!uid) globalError('请登录后再试！');

//     let account: InstanceType<BooksellerModel>;
//     let admin: InstanceType<AdminModel>;
//     try {
//         [account, admin] = await Promise.all([
//             await Bookseller.ybFindOne({
//                 _id: uid,
//                 status: AuditStatus.PASS,
//             })
//                 .select('role ' + select)
//                 .lean(),
//             await Admin.ybFindOne({
//                 _id: uid,
//             })
//                 .select('role ' + select)
//                 .lean(),
//         ]);
//     } catch (e) {
//         console.error(e);
//         globalError('身份信息格式不符');
//     }

//     const person = account || admin;
//     const personModel = account ? BooksellerRole : AdminRole;
//     if (!person) {
//         globalError('请登录后再试！');
//     } else if (permission && person.isSlave) {
//         // 子账号需要检查权限
//         const role: {
//             mPermission: string;
//             fPermission: string[];
//         } = await (personModel as any).ybFindOne({ _id: person.role });
//         if (!role) globalError('未知角色');

//         switch (role.mPermission) {
//             case ManagePermissionType.ADMIN:
//                 // 管理员权限具备所有权限
//                 break;
//             case ManagePermissionType.OPERATION: {
//                 // 运营权限具备读写权限
//                 if (
//                     !role.fPermission.some(perm =>
//                         new RegExp(permission.slice(2)).test(perm),
//                     )
//                 )
//                     globalError('你没有该项权限');
//                 else break;
//             }
//             case ManagePermissionType.CUSTOMER: {
//                 // 客服权限只具备读取权限
//                 if (
//                     permission.startsWith('w') ||
//                     !role.fPermission.some(perm =>
//                         new RegExp(permission.slice(2)).test(perm),
//                     )
//                 )
//                     globalError('你没有该项权限');
//                 else break;
//             }
//             default:
//                 globalError('未知的管理权限');
//         }
//     }
//     return { ...person, _id: person.isSlave ? person.master : uid };
// }

// export const CheckPermissionAndSelect = createParamDecorator(
//     async (
//         data: { permission: string; props: string },
//         req: express.Request,
//     ) => {
//         const uid = req.headers.authorization;
//         return await checkPermission(data.permission, uid, data.props);
//     },
// );
